Flask	是一个使用Python语言编写的 Web	,优点轻量级的框架，容易被扩展，因而也就引发了一个问题，扩展太多可能就不兼容，系统不够稳定。

 #【项目结构】 都可以手动来写
    项目文件夹/app.py 启动程序名称，默认会假设你把程序存储在名为	app.py 或	wsgi.py	的文件中。
    项目文件夹/.env, 而	.env	则用来存储敏 感数据，不应该提交进Git仓库； #type nul >.env windows环境新建.env文件的命令；
    项目文件夹/.flaskenv，	用来存储Flask命令行系统相关的公开环境变量；如果你使用了其他名称，就要设置系统环境变量'FLASK_APP'来告诉Flask你要启动哪个程序。
    项目文件夹/templates 用例存放模板视图文件
    项目文件夹/static 用来存放css样式、js脚本、图片等静态文件
    项目文件夹/models 用来存放模型类

 

 # 【视图函数】
    一个视图函数也可以绑定多个	URL，这通过附加多个装饰器实现;
    视图函数的返回值会自动转换为一个响应对象。如果返回值是一个字符串，
    那么会被转换为一个包含作为响应体的字符串、一个 200 OK 出错代码 和一个 text/html 类型的响应对象。
    如果返回值是一个字典，那么会调用 jsonify() 来产生一个响应。以下是转换的规则：
    如果视图返回的是一个响应对象，那么就直接返回它。
    如果返回的是一个字符串，那么根据这个字符串和缺省参数生成一个用于返回的 响应对象。
    如果返回的是一个字典，那么调用 jsonify 创建一个响应对象。
    如果返回的是一个元组，那么元组中的项目可以提供额外的信息。元组中必须至少 包含一个项目，
    且项目应当由 (response, status) 、 (response, headers) 或者 (response, status, headers) 组成。 
    status 的值会重载状态代码， headers 是一个由额外头部值组成的列表 或字典。
    如果以上都不是，那么 Flask 会假定返回值是一个有效的 WSGI 应用并把它转换为 一个响应对象。
    如果想要在视图内部掌控响应对象的结果，那么可以使用 make_response() 函数。

 # 【模板处理】
    Favicon（favourite	icon）是显示在标签页和书签栏的网站头像。
    projecName/templates 目录下放置模板文件
        #.html文件
        # 如果要改变默认静态文件的路径，则可以在实例化flask程序时声明
        # 同理要改变默认模板的位置，也要用此方法声明
        # app = Flask(__name__,static_folder='/tmp')

        
 #【运行程序】
    app.run这种方式只适合于开发，如果在生产环境中，应该使用Gunicorn或者uWSGI来启动。
    flask run 是走的生成服务
    python app.py 是依照配置执行的
    Flask项目的配置，都是通过app.config对象来进行配置的
    flask 使用werkzeug作为 应用程序网关，django使用uWSGI。


 #【创建数据库】
    可以选择的扩展插件 SQLAlchemy，Flask-SQLAlchemy;
    如果你想在不破坏数据库内的数据的前提下变更表的 结构，需要使用数据库迁移工具，
    比如集成了	Alembic	的	Flask-Migrate	扩展;
    需要打开flask shell进行操作  命令：flask shell;
    如果改动了模型，需要db.drop_all(); db.create_all;

  
  #【字符串处理】
    Flask中默认没有开启全局自动转义
    采用render_template函数进行渲染的，则会开启自动转义。
    并且当用render_template_string函数的时候，会将所有的字符串进行转义后再渲染。
    对于一些不信任的字符串，可以通过{{ content_html|e }}或者是{{ content_html|escape }}的方式进行转义。
    通过{{ content_html|safe }}的方式关闭自动转义
    而{%autoescape true/false%}...{%endautoescape%}可以将一段代码块放在中间，来关闭或开启自动转义。

    使用 Visual Studio Code 开发 Flask 程序的时候，一直提示 Instance of 'SQLAlchemy' has no 'Column' member 错误，
    同样的代码在其它的 IDE 就没有问题，在网上查了一下，判断是 pylint 的原因。
    pylint 是一个 Python 源代码检查和高亮的工具，类似的还有 flake8 （需要安装）
    然后在设置》settings.json 中添加如下代码
    "python.linting.flake8Enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Args": [
      "--disable=E1101",
      "--max-line-length=120"
      ]
    解决方法：关闭 pylint，启用 flake8

 #【输出JSON】
      因为字典不在Flask的响应类型支持范围中，那么将调用app.response_class这个属性的force_type类方法,
      而app.response_class的默认值为Response,我们要设置app.response_class=JSONResponse，
      然后重写JSONResponse中的force_type类方法，在这个方法中将字典转换成JSON格式的字符串后再返回。
      自定义响应必须满足三个条件：
        必须继承自Response类。
        实现类方法force_type(cls,rv,environ=None)。
        必须指定app.response_class为你自定义的Response
    
    使用 jsonify 时，返回的 http response 的 Content-Type 是“ application/json”,
    而json.dumps()返回的是“Content-Type: text/html; charset=utf-8”;
    即便内容相同，jsonify 返回的数据体积更小,它返回的数据直接没有空格隔开。
